﻿using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Web;
using HtmlAgilityPack;
using MagicTraderLib.Schema;

namespace MagicTraderLib.Site.NM
{
    public class NedermagicSite : IMagicVerzamelingSite
    {
        private const string CollectieBaseUrl = @"http://www.nedermagic.nl/magic-cards.asp?col={0}&ou=collectie";

        private const string WieisOnlineUrl = @"http://www.nedermagic.nl/wieisonline.asp";
            // op kaartid werkt ook :) @"http://www.nedermagic.nl/meerinfo.asp?cardid=70086"

        private const string PpPaginaBaseUrl = @"http://www.nedermagic.nl/pp_item.asp?userid=";

        /// <summary>
        /// Iets moet gevuld zijn
        /// je kan zoeken op kaart of serie of beide
        /// - alleen een kaartnaam, je krijgt alle kaarten van alle sets terug
        /// - alleen een serie, je krijgt alle kaarten van de serie terug
        /// - een kaartnaam en serie, je krijgt de kaarte foil + non-foil terug
        /// </summary>
        /// <param name="naam"></param>
        /// <param name="serie"></param>
        /// <param name="foil"></param>
        /// <returns></returns>
        public IEnumerable<Kaart> LeesKaartGegevens(string naam, string serie = null, bool foil = false)
        {
            throw new NotImplementedException();
        }

        public IEnumerable<Kaart> LeesKaartGegevensPerSerie(string serie)
        {
            throw new NotImplementedException();
        }

        public Verzameling LeesVerzamelingCache(string userId)
        {
            var result = new Verzameling(int.Parse(userId));
            return result;
        }

        public Verzameling LeesVerzameling(string userId)
        {
            SchrijfVerzamelingAsync(userId);
            var result = new Verzameling(int.Parse(userId));
            return result;
        }

        public void SchrijfVerzamelingAsync(string userId)
        {
            IEnumerable<string> paginasLinks = BepaalPaginas(userId);

            // maximaal 10 files per keer downloaden en opslaan :)
            var options = new ParallelOptions {MaxDegreeOfParallelism = 10};
            Parallel.ForEach(paginasLinks, options, pageUrl => DownloadFile(userId, pageUrl));
        }

        private IEnumerable<string> BepaalPaginas(string userId)
        {
            int aantalpages = BepaalAantalPaginas(userId);

            var url = String.Format(CollectieBaseUrl, userId);

            var paginas = new List<string>();
            for (int i = 1; i <= aantalpages; i++)
            {
                string urlPagina = String.Format(@"{0}&page={1}", url, i);
                paginas.Add(urlPagina);
            }
            return paginas;
        }

        private int BepaalAantalPaginas(string userId)
        {
            var url = String.Format(CollectieBaseUrl, userId);
            var response = WebHelper.LeesNedermagicAantalPaginas(url);
            return response;
        }

        private void DownloadFile(string userId, string pageUrl)
        {
            var nr = pageUrl.LastIndexOf('=');
            var strnr = pageUrl.Substring(nr + 1);

            var filename = String.Format(@"c:\temp\{0}\haves-pagina{1}.html", userId, strnr);

            WebHelper.DownloadFile(pageUrl, filename);
        }

        public IEnumerable<string> WieRuiltdezeKaart(string kaartUrl)
        {
            var result = new List<string>();
            var content = WebHelper.DownloadString(kaartUrl);

            var doc = new HtmlDocument();
            doc.LoadHtml(content);
            var nodes = doc.DocumentNode.SelectNodes("//a[@title='Persoonlijke pagina']");

            foreach (var node in nodes)
            {
                var url = node.Attributes["href"].Value;
                int startindex = url.IndexOf("userid=", StringComparison.InvariantCultureIgnoreCase) + 7;
                if (startindex == -1) continue;

                int id;
                if (!int.TryParse(url.Substring(startindex), out id))
                {
                    continue;
                }

                result.Add(id.ToString());
            }
            return result;
        }

        public IEnumerable<UsersOnline> GetUsersOnline()
        {
            var result = new List<UsersOnline>();
            var content = WebHelper.DownloadString(WieisOnlineUrl);

            var doc = new HtmlDocument();
            doc.LoadHtml(content);
            var nodes = doc.DocumentNode.SelectNodes("//a[@title='Persoonlijke pagina']");

            var currentDate = DateTime.Now;
            foreach (var node in nodes)
            {
                //url like : magic-cards.asp?ou=collectie&col=49346
                var url = node.Attributes["href"].Value;
                int startindex = url.IndexOf("userid=", StringComparison.InvariantCultureIgnoreCase) + 7;
                if (startindex == -1) continue;

                int id;
                if (!int.TryParse(url.Substring(startindex), out id))
                {
                    continue;
                }

                var pp = PpPaginaBaseUrl + id;

                result.Add(new UsersOnline
                {
                    Id = id
                    ,
                    Name = HttpUtility.HtmlDecode(node.InnerHtml)
                    ,
                    Online = currentDate
                    ,
                    Pp = pp

                });
            }
            return result;
        }
    }
}
